/* 
 * File:   cIntroGame.cpp
 * Author: josep
 * 
 * Created on 12 / gener / 2011, 02:39
 */

#include "cMessageGame.h"
#include "Globals.h"
#include "cAbstractGame.h"

cMessageGame::cMessageGame() {
}

cMessageGame::~cMessageGame() {
    for(list<cScene*>::iterator it=SceneManager.begin(); it!=SceneManager.end(); it++){
        delete (*it);
    }
    delete Camera;
}

bool cMessageGame::Init(cData * m_Data, cCamera* cam){
    bool res=true;
    Data = m_Data;

     //Graphics initialization
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,CAMERA_WIDTH,0,CAMERA_HEIGHT,0,1);
    glMatrixMode(GL_MODELVIEW);
    //Alpha test enabled
    glAlphaFunc(GL_GREATER, 0.05f);
    glEnable(GL_ALPHA_TEST);
    //Textures enabled
    glEnable(GL_TEXTURE_2D);

    //Scene initialization
    //cBackgroundScene *Scene=new cBackgroundScene();
    cScene * Scene =new cBackgroundScene();
    ((cBackgroundScene*) Scene)->Init(Data->loadImage(CLOUDS_IMG, GL_RGB), true, true, 0.7, 0);
    SceneManager.push_back((cScene*&) Scene);

    Scene=new cBackgroundScene();
    ((cBackgroundScene*) Scene)->Init(Data->loadImage(BACKGROUND_IMG, GL_RGB),
                                                    true, false, 0, 0);
    SceneManager.push_back((cScene*&) Scene);

    Scene=new cBackgroundScene();
    ((cBackgroundScene*) Scene)->Init(Data->loadImage(_51A_IMG, GL_RGBA),
                                                    true, false, 0.4, 0, 0, 150);
    SceneManager.push_back((cScene*&) Scene);

    /*
    Scene=new cBackgroundScene();
    ((cBackgroundScene*) Scene)->Init(Data->loadImage("PecVJ2D_level1_v2_1.png", GL_RGBA),
                                                    false, false, 0, 0, 100, 0);
    SceneManager.push_back((cScene*&) Scene);
     */

    Scene = new cTiledScene();
    ((cTiledScene*) Scene)->InitFromIniFile(PECVJ2D_SCENE_LEVEL_CFG, Data);
    SceneManager.push_back((cScene*&) Scene);


    //Camera initialization
    cCamera * sccamera = new cCamera();
    sccamera->Init(CAMERA_WIDTH, CAMERA_HEIGHT, 1, 1);
    Camera = sccamera;
    sccamera->SetWorldDimension(X,((cTiledScene*) Scene)->GetScenWidth()
                            * ((cTiledScene*) Scene)->GetTileSize());
    sccamera->SetWorldDimension(Y,((cTiledScene*) Scene)->GetSceneHeight()
                            * ((cTiledScene*) Scene)->GetTileSize());


    SceneManager.Init(Camera);


    message[INTRO_GAME_ST].SetFont(GLUT_BITMAP_TIMES_ROMAN_24);
    message[INTRO_GAME_ST].SetFontHeight(24);
    message[INTRO_GAME_ST].SetMaxOffsetY(Camera->GetHeight()+Camera->GetPosY()-10);
    message[INTRO_GAME_ST].SetSpacing(2);
    message[INTRO_GAME_ST].SetColor(0,0,0);
    message[INTRO_GAME_ST].GetMessages()->push_back("Por fin te encuentro.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Debo comunicarte, en nombre de la asamblea de brujos y magos");
    message[INTRO_GAME_ST].GetMessages()->push_back("QUE ERES EL ESCOGIDO!");
    message[INTRO_GAME_ST].GetMessages()->push_back("El dragon alado ha pintado tu nombre entre las cenizas del fuego");
    message[INTRO_GAME_ST].GetMessages()->push_back("magico.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Debes llegar hasta el castillo de Mantra. ");
    message[INTRO_GAME_ST].GetMessages()->push_back("Alli encontraras a Jocabor, el gran mago que todo lo sabe.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Tiene un mensaje importantisimo para ti. Acude cuanto antes y ");
    message[INTRO_GAME_ST].GetMessages()->push_back("escuchale. El te dira lo que debes hacer.");
    message[INTRO_GAME_ST].GetMessages()->push_back(" ");
    message[INTRO_GAME_ST].GetMessages()->push_back("Pero TEN CUIDADO!");
    message[INTRO_GAME_ST].GetMessages()->push_back("Por el camino encontras muchos peligros que deberas salvar.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Los Sentinels son peligrosas alimañas capaces de matarte con");
    message[INTRO_GAME_ST].GetMessages()->push_back("solo tocarte.");
    message[INTRO_GAME_ST].GetMessages()->push_back("El camino esta lleno de esas pequeñas pero malvadas criaturas. ");
    message[INTRO_GAME_ST].GetMessages()->push_back("La cabeza es su punto debil. Saltales encima i moriran de immediato.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Por el camino quiza encuentres tambien a Grujb conduciendo su viejo ");
    message[INTRO_GAME_ST].GetMessages()->push_back("tanque. Si te descubre te perseguirá incansablemente hasta que una ");
    message[INTRO_GAME_ST].GetMessages()->push_back("de sus balas te alcance. ¡Recuerda! La unica forma de acabar con el");
    message[INTRO_GAME_ST].GetMessages()->push_back("Alimentandote bien. Come cuanto puedas y con un poco de suerte quiza ");
    message[INTRO_GAME_ST].GetMessages()->push_back("logres vencer a Grujb.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Una vez consigas desacerte de Gurjb, busca la puerta de entrada al castillo.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Necesitaras una llave que encontraras por el camino. No la dejes atras,");
    message[INTRO_GAME_ST].GetMessages()->push_back("porque no podras abrir sin la llave.");
    message[INTRO_GAME_ST].GetMessages()->push_back("Tras la puerta, encontraras a Jocabor. Escuchale!");
    message[INTRO_GAME_ST].GetMessages()->push_back("Ahora vete. Se hace tarde...");
    message[INTRO_GAME_ST].GetMessages()->push_back("y recuerda. La bondad y la fuerza estan de tu parte.");
    message[INTRO_GAME_ST].SetPosX(Camera->GetPosX()+10);
    message[INTRO_GAME_ST].SetPosY(Camera->GetPosY()+20);

    message[WINNER_GAME_ST].SetFont(GLUT_BITMAP_TIMES_ROMAN_24);
    message[WINNER_GAME_ST].SetFontHeight(24);
    message[WINNER_GAME_ST].SetMaxOffsetY(Camera->GetHeight()+Camera->GetPosY()-10);
    message[WINNER_GAME_ST].SetSpacing(2);
    message[WINNER_GAME_ST].SetColor(0,0,0);
    message[WINNER_GAME_ST].GetMessages()->push_back("JA, JA JA!");
    message[WINNER_GAME_ST].GetMessages()->push_back("Has caido en la trampa.");
    message[WINNER_GAME_ST].GetMessages()->push_back("TENGO QUE DECIRTE QUE EN RALIDAD TE HE TRAIDO ");
    message[WINNER_GAME_ST].GetMessages()->push_back("HASTA AQUI SOLAMENTE PARA...");
    message[WINNER_GAME_ST].GetMessages()->push_back("...");
    message[WINNER_GAME_ST].GetMessages()->push_back("...");
    message[WINNER_GAME_ST].GetMessages()->push_back("DESEARTE UN FELIZ 2012!");
    message[WINNER_GAME_ST].GetMessages()->push_back("QUE TENGAS MUCHA SUERTE!");
    message[WINNER_GAME_ST].SetPosX(Camera->GetPosX()+10);
    message[WINNER_GAME_ST].SetPosY(Camera->GetPosY()+120);

    message[GAME_OVER_GAME_ST].SetFont(GLUT_BITMAP_TIMES_ROMAN_24);
    message[GAME_OVER_GAME_ST].SetFontHeight(24);
    message[GAME_OVER_GAME_ST].SetMaxOffsetY(Camera->GetHeight()+Camera->GetPosY()-10);
    message[GAME_OVER_GAME_ST].SetSpacing(2);
    message[GAME_OVER_GAME_ST].SetColor(0,0,0);
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("                  CREDITOS");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("Este videojuego ha sido realizado por Josep Cañellas en la ");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("asignatura de videojuegos 2D del Postgrado de Videojuegos de " );
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("la UOC. ");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("El juego se ha implemntado en C++ estandard usando las librerias");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("GLUT de OPENGL i Corona para cargar ficheros de imagenes.");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("Este juego es un pequeño ejemplo de lo que se puede hacer con ");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("un secillo marco de programación implementado integramente durante");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("el transcurso de la asignatura videojuegos 2D");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("");
    message[GAME_OVER_GAME_ST].GetMessages()->push_back("para mas informacion: jcanellas@uoc.edu");
    message[GAME_OVER_GAME_ST].SetPosX(Camera->GetPosX()+10);
    message[GAME_OVER_GAME_ST].SetPosY(Camera->GetPosY()+120);

    message[LOSER_GAME_ST].SetFont(GLUT_BITMAP_TIMES_ROMAN_24);
    message[LOSER_GAME_ST].SetFontHeight(24);
    message[LOSER_GAME_ST].SetMaxOffsetY(Camera->GetHeight()+Camera->GetPosY()-10);
    message[LOSER_GAME_ST].SetSpacing(2);
    message[LOSER_GAME_ST].SetColor(0,0,0);
    message[LOSER_GAME_ST].GetMessages()->push_back("JA, JA JA!");
    message[LOSER_GAME_ST].GetMessages()->push_back("Has perdido. Mala suerte!");
    message[LOSER_GAME_ST].GetMessages()->push_back("Pero no te preocupes. Todo era una mentira!");
    message[LOSER_GAME_ST].GetMessages()->push_back("EN REALIDAD SOLO QUERIA...");
    message[LOSER_GAME_ST].GetMessages()->push_back("...");
    message[LOSER_GAME_ST].GetMessages()->push_back("...");
    message[LOSER_GAME_ST].GetMessages()->push_back("DESEARTE UN FELIZ 2012!");
    message[LOSER_GAME_ST].GetMessages()->push_back("QUE TENGAS MUCHA SUERTE!");


    message[LOSER_GAME_ST].SetPosX(Camera->GetPosX()+10);
    message[LOSER_GAME_ST].SetPosY(Camera->GetPosY()+120);

    return res;
}

int cMessageGame::Loop(){
        int time = glutGet(GLUT_ELAPSED_TIME);
        int elapsedTime;

        Process();
        if(nextGame==gameState){
            message[gameState].SetOffsetY(message[gameState].GetOffsetY()+1);
            Render();
            int dif=message[gameState].GetOffsetY();
            dif-=((message[gameState].GetMessages()->size()*message[gameState].GetFontHeight())/*>>1*/);
            if(dif>message[gameState].GetMaxOffsetY()){
                if(gameState==INTRO_GAME_ST){
                    nextGame=CENTRAL_GAME_ST;
                }else if(gameState==GAME_OVER_GAME_ST){
                    nextGame=EXIT_GAME_ST;
                }else{
                    nextGame=GAME_OVER_GAME_ST;
                }
            }

            do { elapsedTime= glutGet(GLUT_ELAPSED_TIME);
            } while(elapsedTime-time<100);
        }


	return nextGame;
}

void cMessageGame::Finalize(){
}

//Input
void cMessageGame::ReadKeyboard(unsigned char key, int x, int y, bool press){
	keys[key] = press;
}

void cMessageGame::ReadMouse(int button, int state, int x, int y){
}

//Process
void cMessageGame::Process(){
	//Process Input
	if(keys[27]){
            keys[27]=false;
            if(gameState==INTRO_GAME_ST){
                nextGame=CENTRAL_GAME_ST;
            }else if(gameState==GAME_OVER_GAME_ST){
                nextGame=EXIT_GAME_ST;
            }else{
                nextGame=GAME_OVER_GAME_ST;
            }
        }
}

//Output
void cMessageGame::Render(){
	glClear(GL_COLOR_BUFFER_BIT);

	glLoadIdentity();

        Camera->Show();

        SceneManager.Draw();

        //actualiza la puntuación
        message[nextGame].Draw();

        glutSwapBuffers();
}


